/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package DAO;

import Database.DBConnection;
import Database.PropertiesManager;
import Model.Privilegio;
import Model.Usuario;
import java.io.IOException;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;

/**
 *
 * @author 0433101
 */
public class UsuarioDAO{
     private static HashMap dados;
    
    static{
        try{
    dados = new PropertiesManager("sql.properties").readPropertiesFile();
        } catch (IOException ioe){
            System.out.println(ioe);
        }
    }
    
    public static boolean inserir(Usuario usuario) throws SQLException, ClassNotFoundException, IOException{
        Connection conexao = DBConnection.getInstance();
        
        Usuario temp = pesquisarByLogin(usuario.getLogin()); 
        
        if(temp == null){
            String sql = loadSQL("Insert.Usuarios");
            PreparedStatement pstmt = conexao.prepareStatement(sql);
            pstmt.setString(1, usuario.getNome());
            if(usuario.getNascimento() != null){
                pstmt.setDate(2, new java.sql.Date(usuario.getNascimento().getTime()));
            }
            else{
                pstmt.setDate(2, null);
            }
            pstmt.setInt(3, usuario.getPrivilegio().getId());
            pstmt.setString(4, usuario.getSenha());
            pstmt.setString(5, usuario.getLogin());
            pstmt.setString(6, usuario.getEmail());
            
            int bloquear;
            if(usuario.isBloquear()){
                bloquear = 1;
            }
            else{
                bloquear = 0;
            }
            
            pstmt.setInt(7, bloquear);

            pstmt.executeUpdate(); // tbm funciona com pstmt.execute();
            return true;
        }
        return false;
    } 
    
    public static Usuario pesquisarByLogin(String login) throws SQLException, ClassNotFoundException, IOException{
        Connection conexao = DBConnection.getInstance();
        String sql = loadSQL("SelectByLogin.Usuarios");
        PreparedStatement pstmt = conexao.prepareStatement(sql);
        pstmt.setString(1, login);
        ResultSet rs = pstmt.executeQuery();
        Usuario usuario = null;
        if(rs.next()){
            String nome = rs.getString("NOME");
            Date data = rs.getDate("NASCIMENTO");
            int id_privilegio = rs.getInt("ID_PRIVILEGIO");
            String senha = rs.getString("SENHA");
            String email = rs.getString("EMAIL");
            int b = rs.getInt("BLOQUEAR");
            boolean bloquear;
            if(b == 0){
                bloquear = false;
            }
            else{
                bloquear = true;
            }
            
            Privilegio p = PrivilegioDAO.pesquisar(id_privilegio);
            if(p == null){
                return null;
            }
            
            usuario = new Usuario();
            usuario.setNome(nome);
            usuario.setPrivilegio(p);
            usuario.setNascimento(data);
            usuario.setSenha(senha);
            usuario.setLogin(login);
            usuario.setEmail(email);
            usuario.setBloquear(bloquear);
        }
        return usuario;
    } 
    
    public static ArrayList<Usuario> pesquisarAll() throws SQLException, ClassNotFoundException, IOException{
        Connection conexao = DBConnection.getInstance();
        String sql = loadSQL("Select.Usuarios");
        PreparedStatement pstmt = conexao.prepareStatement(sql);
        ResultSet rs = pstmt.executeQuery();
        ArrayList<Usuario> usuarios = new ArrayList<Usuario>();
        
        while(rs.next()){
            
            String login = rs.getString("LOGIN");
            String nome = rs.getString("NOME");
            Date data = rs.getDate("NASCIMENTO");
            int id_privilegio = rs.getInt("ID_PRIVILEGIO");
            String senha = rs.getString("SENHA");
            String email = rs.getString("EMAIL");
            int b = rs.getInt("BLOQUEAR");
            boolean bloquear;
            
            if(b == 0){
                bloquear = false;
            }
            else{
                bloquear = true;
            }
            
            Privilegio p = PrivilegioDAO.pesquisar(id_privilegio);
            if(p == null){
                continue;
            }
            
            Usuario usuario = new Usuario();
            usuario.setNome(nome);
            usuario.setPrivilegio(p);
            usuario.setNascimento(data);
            usuario.setSenha(senha);
            usuario.setLogin(login);
            usuario.setEmail(email);
            usuario.setBloquear(bloquear);
            usuarios.add(usuario);
        }
        
        return usuarios;
    }
    
    public static void bloquearLogin(String login) throws SQLException, ClassNotFoundException, IOException{
        Connection conexao = DBConnection.getInstance();
        Usuario user = pesquisarByLogin(login);
        int bloquear;
        if(user.isBloquear()){
            bloquear = 0;
            user.setBloquear(false);
        }
        else{
            bloquear = 1;
            user.setBloquear(true);
        }
        
        String sql = loadSQL("UpdateBloquear.Usuarios");
        PreparedStatement pstmt = conexao.prepareStatement(sql);        
        pstmt.setInt(1, bloquear);
        pstmt.setString(2, user.getLogin());

        pstmt.executeUpdate();
    }
    
    public static boolean updateUsuario(Usuario user, String oldLogin) throws SQLException, ClassNotFoundException, IOException{
        Connection conexao = DBConnection.getInstance();
        if(!oldLogin.equals(user.getLogin())){
            Usuario aux = pesquisarByLogin(user.getLogin());
            if(aux != null){
                return false;                
            }
        }
        
        String sql = loadSQL("Update.Usuarios");
        PreparedStatement pstmt = conexao.prepareStatement(sql);        
        pstmt.setString(1, user.getNome());
        if(user.getNascimento() != null){
                pstmt.setDate(2, new java.sql.Date(user.getNascimento().getTime()));
        }
        else{
            pstmt.setDate(2, null);
        }
        pstmt.setString(3, user.getSenha());
        pstmt.setString(4, user.getLogin());
        pstmt.setString(5, user.getEmail());
        pstmt.setString(6, oldLogin);

        pstmt.executeUpdate();  
        return true;
    }
    
    public static void updatePermissao(int permissao, String login) throws SQLException, ClassNotFoundException, IOException{
        Connection conexao = DBConnection.getInstance();
        String sql = loadSQL("UpdatePermissao.Usuarios");
        PreparedStatement pstmt = conexao.prepareStatement(sql);   
        pstmt.setInt(1, permissao);
        pstmt.setString(2, login);
        
        pstmt.executeUpdate(); 
    }
    
    public static boolean removerUsuario(String login) throws SQLException, ClassNotFoundException, IOException{
        if(login == null || login.equals("")){
            return false;
        }
        
        Connection conexao = DBConnection.getInstance();
        String sql = loadSQL("Delete.Usuarios");
        PreparedStatement pstmt = conexao.prepareStatement(sql);
        pstmt.setString(1, login);
        pstmt.execute();
        return true;
    }
    
    private static String loadSQL(String key){
        String sql=null;
        sql = (String) dados.get(key);
        return sql;
    }    
}